using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// Summary description for EntregablesBD
/// </summary>
public class EntregablesBD
{	
	//constructor de entregables
	public EntregablesBD()
	{
		//
		// TODO: Add constructor logic here
		//
	}
	
	//Consulta de entregables para cargar el grid, obtengo (id y nombre)
    public DataTable ConsultarEntregables()
    {

        DataTable resultados = new DataTable();
        SqlDataAdapter adpEntregables = new SqlDataAdapter();
		
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar!
            SqlCommand cmd = new SqlCommand("Select id,nombre from Entregables");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            adpEntregables.SelectCommand = cmd;
            adpEntregables.Fill(resultados);
        }

        return resultados;
    }
	
	//funcion de consulta de los datos especificos de un entregable, devuelve la entidad entregable	
    public EntregablesEnt ConsultarEntregable(int id)
    {
        EntregablesEnt resultado = null;
		//utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
			//Declaracion del comando a ejecutar
            SqlCommand cmd = new SqlCommand("Select id, nombre, descripcion from Entregables where id = @id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id));//especificacion del parametro
															//Para consultar

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerEntregable(dr); //obtengo la entidad de tarea
            }
        }
        return resultado;
    }

	//leer tupla correspondiente al entregable
    private EntregablesEnt ObtenerEntregable(SqlDataReader dr)
    {
        EntregablesEnt resultado = null;

        if (dr.HasRows)
        {
            dr.Read();//leo la tupla
			//obtengo los valores

            int colId = dr.GetOrdinal("Id");
            int colNombre = dr.GetOrdinal("Nombre");
            int colDescripcion = dr.GetOrdinal("Descripcion");

            object[] valores = new object[dr.FieldCount];
            dr.GetValues(valores);
			
			//casteo los valores al tipo correspondiente
            int id = (int)valores[colId];
            string nombre = (string)valores[colNombre];
            string descripcion = (string)valores[colDescripcion];

            resultado = new EntregablesEnt(id, nombre, descripcion);//devuelvo la entidad
        }
        return resultado;
    }
	
	//Metodo de insercion del entregable en la base de datos
    public bool InsertarEntregable(EntregablesEnt Entregable)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Entregables(nombre, descripcion) values(@nombre,@descripcion)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego todos los parametro correspondientes a datos del entregable
                cmd.Parameters.Add(new SqlParameter("@nombre", Entregable.Nombre));
                cmd.Parameters.Add(new SqlParameter("@descripcion", Entregable.Descripcion));
                cmd.ExecuteNonQuery();
            }

        }
        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

        return resultado;
    }

	//elimina el entregable de la base de datos, recibe el id del entregable a eliminar	
    public bool EliminarEntregable(int id)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
				//Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Entregables where id = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@id", id));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false;	//devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }

	//Metodo de actualizacion de los datos de un entregable
    public bool ActualizarEntregable(EntregablesEnt Entregable)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                SqlCommand cmd = //Declaracion del comando de modificacion
                    new SqlCommand("Update Entregables set nombre = @nombre, descripcion = @descripcion where id = @id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
				//agrego los parametros a la consulta
                cmd.Parameters.Add(new SqlParameter("@id", Entregable.Id));
                cmd.Parameters.Add(new SqlParameter("@nombre", Entregable.Nombre));
                cmd.Parameters.Add(new SqlParameter("@descripcion", Entregable.Descripcion));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false;//devuelvo falso si no se logro conectar o hubo un error
        }

        return resultado;
    }


    public List<EntregablesEnt> RecuperarEntregables()
    {
        List<EntregablesEnt> listaEntregables = null;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select id,	nombre from Entregables");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaEntregables = this.ObtenerEntregables(dr);
            }
        }

        return listaEntregables;
    }

    //Crea una lista de Entregables que devolver a partir de los datos obtenidos por
    //la consulta en SQL y la devuelve.
    private List<EntregablesEnt> ObtenerEntregables(SqlDataReader dr)
    {
        List<EntregablesEnt> listaEntregables = new List<EntregablesEnt>();

        int colId = dr.GetOrdinal("ID");
        int colNombre = dr.GetOrdinal("Nombre");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            string nombre = (string)valores[colNombre];

            listaEntregables.Add(new EntregablesEnt(id, nombre));
        }

        return listaEntregables;
    }



  
}
